{"componentChunkName":"component---src-templates-blog-page-index-tsx","path":"/assinaturas-e-hashing-keccak/","result":{"data":{"mdx":{"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"layout\": \"BlogPage\",\n  \"title\": \"Verificando assinatura hashing com Keccak256\",\n  \"description\": \"Nesse artigo iremos abordar sobre como verificar uma assinatura hashing através da função keccak256.\",\n  \"image\": \"capa.jpg\",\n  \"tags\": [\"Intermediário\", \"Avançado\"],\n  \"author\": [\"Matheus\"],\n  \"publishedAt\": \"28/05/2022\",\n  \"modifiedAt\": \"20220528\",\n  \"suburl\": \"assinaturas-e-hashing-keccak/\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Nesse artigo iremos abordar sobre como verificar uma assinatura hashing atrav\\xE9s da fun\\xE7\\xE3o \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"keccak256\"), \".\"), mdx(\"h2\", {\n    \"id\": \"hashing-com-keccak256\"\n  }, \"Hashing com Keccak256\"), mdx(\"p\", null, \"O \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"keccack256\"), \" \\xE9 uma fun\\xE7\\xE3o nativa do Solidity que calcula o hash de entrada Keccak-256.\"), mdx(\"p\", null, \"Alguns casos de uso s\\xE3o:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Criar um ID exclusivo determin\\xEDstico de uma entrada\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Esquema de confirma\\xE7\\xE3o-revela\\xE7\\xE3o\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Assinatura criptografada compacta (assinando o hash em vez de uma entrada maior)\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\ncontract HashFunction {\\n    function hash(\\n        string memory _text,\\n        uint _num,\\n        address _addr\\n    ) public pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(_text, _num, _addr));\\n    }\\n\\n    // Exemplo de colis\\xE3o de hash\\n    // A colis\\xE3o de hash pode ocorrer quando voc\\xEA passa mais de um tipo de dados din\\xE2mico\\n    // para abi.encodePacked. Nesse caso, voc\\xEA deve usar abi.encode.\\n    function collision(string memory _text, string memory _anotherText)\\n        public\\n        pure\\n        returns (bytes32)\\n    {\\n        // encodePacked(AAA, BBB) -> AAABBB\\n        // encodePacked(AA, ABBB) -> AAABBB\\n        return keccak256(abi.encodePacked(_text, _anotherText));\\n    }\\n}\\n\\ncontract GuessTheMagicWord {\\n    bytes32 public answer =\\n        0x60298f78cc0b47170ba79c10aa3851d7648bd96f2f8e46a19dbc777c36fb0c00;\\n\\n    // Palavra m\\xE1gica \\xE9 \\\"Solidity\\\"\\n    function guess(string memory _word) public view returns (bool) {\\n        return keccak256(abi.encodePacked(_word)) == answer;\\n    }\\n}\\n\")), mdx(\"br\", null), mdx(\"h2\", {\n    \"id\": \"verificando-uma-assinatura\"\n  }, \"Verificando uma assinatura\"), mdx(\"p\", null, \"As mensagens podem ser assinadas fora da blockchain e depois verificadas dentro da blockchain usando um contrato inteligente.\"), mdx(\"p\", null, \"Aqui um exemplo de verifica\\xE7\\xE3o da assinatura assinada fora do contrato e verificado na chamada de uma fun\\xE7\\xE3o do contrato.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\n/* Verifica\\xE7\\xE3o de assinatura\\n\\nComo assinar e verificar\\n# Assinatura\\n1. Crie uma mensagem para assinar\\n2. Fa\\xE7a o hash da mensagem\\n3. Assine o hash (fora da blockchain, mantenha sua chave privada em segredo)\\n\\n# Verificar\\n1. Recrie o hash da mensagem original\\n2. Recupere o signat\\xE1rio da assinatura e do hash\\n3. Compare o signat\\xE1rio recuperado com o signat\\xE1rio reivindicado\\n*/\\n\\ncontract VerifySignature {\\n    /* 1. Desbloqueie sua conta MetaMask\\n    ethereum.enable()\\n    */\\n\\n    /* 2. Obt\\xE9m a mensagem com o c\\xF3digo hash de assinatura\\n    getMessageHash(\\n        0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C,\\n        123,\\n        \\\"coffee and donuts\\\",\\n        1\\n    )\\n\\n    hash = \\\"0xcf36ac4f97dc10d91fc2cbb20d718e94a8cbfe0f82eaedc6a4aa38946fb797cd\\\"\\n    */\\n    function getMessageHash(\\n        address _to,\\n        uint _amount,\\n        string memory _message,\\n        uint _nonce\\n    ) public pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(_to, _amount, _message, _nonce));\\n    }\\n\\n    /* 3. Assina o contrato com o hash\\n    # usando um navegador\\n    account = \\\"copie e cole a conta do signat\\xE1rio aqui\\\"\\n    ethereum.request({ method: \\\"personal_sign\\\", params: [account, hash]}).then(console.log)\\n\\n    # usando a web3\\n    web3.personal.sign(hash, web3.eth.defaultAccount, console.log)\\n\\n    A assinatura ser\\xE1 diferente para contas diferentes\\n    0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b\\n    */\\n    function getEthSignedMessageHash(bytes32 _messageHash)\\n        public\\n        pure\\n        returns (bytes32)\\n    {\\n        /*\\n        A assinatura \\xE9 produzida assinando um hash keccak256 com o seguinte formato:\\n        \\\"\\\\x19Ethereum Signed Message\\\\n\\\" + len(msg) + msg\\n        */\\n        return\\n            keccak256(\\n                abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", _messageHash)\\n            );\\n    }\\n\\n    /* 4. Verifica a assinatura\\n    signer = 0xB273216C05A8c0D4F0a4Dd0d7Bae1D2EfFE636dd\\n    to = 0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C\\n    amount = 123\\n    message = \\\"coffee and donuts\\\"\\n    nonce = 1\\n    signature =\\n        0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b\\n    */\\n    function verify(\\n        address _signer,\\n        address _to,\\n        uint _amount,\\n        string memory _message,\\n        uint _nonce,\\n        bytes memory signature\\n    ) public pure returns (bool) {\\n        bytes32 messageHash = getMessageHash(_to, _amount, _message, _nonce);\\n        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);\\n\\n        return recoverSigner(ethSignedMessageHash, signature) == _signer;\\n    }\\n\\n    function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature)\\n        public\\n        pure\\n        returns (address)\\n    {\\n        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);\\n\\n        return ecrecover(_ethSignedMessageHash, v, r, s);\\n    }\\n\\n    function splitSignature(bytes memory sig)\\n        public\\n        pure\\n        returns (\\n            bytes32 r,\\n            bytes32 s,\\n            uint8 v\\n        )\\n    {\\n        require(sig.length == 65, \\\"Tamanho de assinatura inv\\xE1lido\\\");\\n\\n        assembly {\\n            /*\\n            Os primeiros 32 bytes armazenam o comprimento da assinatura\\n\\n            add(sig, 32) = ponteiro da assinatura + 32\\n            efetivamente, pula os primeiros 32 bytes da assinatura\\n\\n            mload(p) carrega os pr\\xF3ximos 32 bytes come\\xE7ando no endere\\xE7o de mem\\xF3ria p na mem\\xF3ria\\n            */\\n\\n            // primeiros 32 bytes, ap\\xF3s o prefixo de comprimento\\n            r := mload(add(sig, 32))\\n            // dos 32 at\\xE9 os 64 bytes\\n            s := mload(add(sig, 64))\\n            // \\xFAltimos 32 byte (primeiro byte dos pr\\xF3ximos 32 bytes)\\n            v := byte(0, mload(add(sig, 96)))\\n        }\\n\\n        // implicitly return (r, s, v)\\n    }\\n}\\n\")), mdx(\"br\", null), mdx(\"p\", null, \"Aqui um exemplo de implementa\\xE7\\xE3o de uma assinatura sendo feita fora do contrato utilizando \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"javascript\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-javascript\"\n  }, \"const { expect } = require(\\\"chai\\\")\\nconst { ethers } = require(\\\"hardhat\\\")\\n\\ndescribe(\\\"VerifySignature\\\", function () {\\n  it(\\\"Check signature\\\", async function () {\\n    const accounts = await ethers.getSigners(2)\\n\\n    const VerifySignature = await ethers.getContractFactory(\\\"VerifySignature\\\")\\n    const contract = await VerifySignature.deploy()\\n    await contract.deployed()\\n\\n    // const PRIV_KEY = \\\"0x...\\\" - Private Key da MetaMask (nunca revele para ningu\\xE9m essa key)\\n    // const signer = new ethers.Wallet(PRIV_KEY)\\n    const signer = accounts[0]\\n    const to = accounts[1].address\\n    const amount = 999\\n    const message = \\\"Hello\\\"\\n    const nonce = 123\\n\\n    const hash = await contract.getMessageHash(to, amount, message, nonce)\\n    const sig = await signer.signMessage(ethers.utils.arrayify(hash))\\n\\n    const ethHash = await contract.getEthSignedMessageHash(hash)\\n\\n    console.log(\\\"signat\\xE1rio           \\\", signer.address)\\n    console.log(\\\"signat\\xE1rio recuperado\\\", await contract.recoverSigner(ethHash, sig))\\n\\n    // Mensagem com assinatura correta ir\\xE1 retornar true\\n    expect(\\n      await contract.verify(signer.address, to, amount, message, nonce, sig)\\n    ).to.equal(true)\\n\\n    // Mensagem com assinatura incorreta ir\\xE1 retornar false\\n    expect(\\n      await contract.verify(signer.address, to, amount + 1, message, nonce, sig)\\n    ).to.equal(false)\\n  })\\n})\\n\")), mdx(\"br\", null), mdx(\"p\", null, \"Para quais casos de uso isso serviria?\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"realizar transa\\xE7\\xF5es de jogos NFT\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"cria\\xE7\\xE3o e transa\\xE7\\xE3o de itens NFT\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"cria\\xE7\\xE3o de um marketplace\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"sistema de airdrops e staking\")), mdx(\"p\", null, \"Entre v\\xE1rias outras utilidades.\"), mdx(\"br\", null), mdx(\"h3\", {\n    \"id\": \"testar-no-remix\"\n  }, \"Testar no \", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"https://remix.ethereum.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"Remix\")), mdx(\"br\", null), mdx(\"br\", null));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"Verificando assinatura hashing com Keccak256","description":"Nesse artigo iremos abordar sobre como verificar uma assinatura hashing através da função keccak256.","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEA//EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAbKNAcYP/8QAGRAAAwEBAQAAAAAAAAAAAAAAAQIREgQQ/9oACAEBAAEFAlM6H2FW5KxqfP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EAB0QAQABAwUAAAAAAAAAAAAAAAERAAJRAxASMXH/2gAIAQEABj8CR1FuumDFKTc4onuuRE+b/wD/xAAcEAACAgIDAAAAAAAAAAAAAAABEQAhMUEQYZH/2gAIAQEAAT8hYSCOAhJkaU4REFJYgkAHvKdo84//2gAMAwEAAgADAAAAEKDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHxABAQABAgcAAAAAAAAAAAAAAREAIVExQWFxgZHR/9oACAEBAAE/EBu+BpzQTk/OuPmbSa9sYgwUlHxpkL5jJR3x42ltgEItd5n/2Q==","aspectRatio":1.5151515151515151,"src":"/static/f5b7dabf1528a0cc98ff58f3af53bd6c/0cb3d/capa.jpg","srcSet":"/static/f5b7dabf1528a0cc98ff58f3af53bd6c/f836f/capa.jpg 200w,\n/static/f5b7dabf1528a0cc98ff58f3af53bd6c/2244e/capa.jpg 400w,\n/static/f5b7dabf1528a0cc98ff58f3af53bd6c/0cb3d/capa.jpg 536w","sizes":"(max-width: 536px) 100vw, 536px"}}},"tags":["Intermediário","Avançado"],"author":["Matheus"],"suburl":"assinaturas-e-hashing-keccak/","publishedAt":"28/05/2022","modifiedAt":"20220528"},"tableOfContents":{"items":[{"url":"#hashing-com-keccak256","title":"Hashing com Keccak256"},{"url":"#verificando-uma-assinatura","title":"Verificando uma assinatura","items":[{"url":"#testar-no-remix","title":"Testar no Remix"}]}]},"timeToRead":1},"allMdx":{"nodes":[{"frontmatter":{"suburl":"sistema-de-swap-estavel-amm/","title":"Como criar um sistema de Swap estável AMM","tags":["Avançado","DeFi"]}},{"frontmatter":{"suburl":"produto-constante-amm/","title":"Como criar um produto constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"soma-constante-amm/","title":"Como criar uma soma constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-cofre/","title":"Como criar um sistema de Cofre","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-staking/","title":"Como criar um sistema de Staking de Recompensas","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-preco-chainlink-oracle/","title":"Como criar um sistema de preços Oracle","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"exemplos-de-uso-do-uniswap-v3/","title":"Exemplos de uso do Uniswap V3","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"fornecimento-unilateral-com-uniswap-v2/","title":"Fornecimento unilateral ideal com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"adicionar-e-remover-liquidez-com-uniswap-v2/","title":"Como adicionar e remover liquidez com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"swap-com-uniswap-v2/","title":"Como realizar Swap com Uniswap V2","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"testes-com-echidna/","title":"Como realizar testes com Echidna","tags":["Intermediário"]}},{"frontmatter":{"suburl":"ignorar-verificacao-do-tamanho-do-contrato/","title":"Como ignorar a verificação do tamanho do contrato","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"repeticao-de-assinatura/","title":"Repetição de assinatura","tags":["Avançado","Hacks"]}},{"frontmatter":{"suburl":"manipular-timestamp-do-bloco/","title":"Manipulando o timestamp do bloco na blockchain","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-front-running/","title":"Ataque utilizando a técnica front running","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"honeypot/","title":"Criar uma armadilha para hackers com a técnica honeypot","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ocultar-script-malicioso/","title":"Como um contrato malicioso esconde seu script","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"phishing-com-txorigin/","title":"Phishing com tx.origin","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"negacao-de-servico/","title":"Inutilizar um contrato através da negação de serviço","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"fonte-de-aleatoriedade/","title":"Fonte de Aleatoriedade","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"chamada-de-funcao-delegatecall/","title":"Chamada de função delegatecall","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"acessando-variaveis-privadas/","title":"Acessando variáveis privadas","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"auto-destruicao/","title":"Ataques com Auto-destruição","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"estouro-de-memoria/","title":"Ataques com estouro de memória","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-de-reentrada/","title":"Ataque de reentrada, aprenda como funciona e como evitar","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"bloqueio-de-tempo-timelock/","title":"Criar um contrato com bloqueio de tempo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"contrato-para-multichamadas/","title":"Criar contrato para Multichamada de funções","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"financiamento-coletivo-crowd-fund/","title":"Criar um sistema de financiamento coletivo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"sistema-de-leilao-ingles-holandes/","title":"Criar um sistema de leilão inglês e holandês","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-bidirecional/","title":"Criar um Canal de pagamento bidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-unidirecional/","title":"Criar um Canal de pagamento unidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"gravar-dados-no-slot/","title":"Como gravar dados em qualquer slot","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"implantar-contrato-com-proxy/","title":"Como implantar qualquer contrato com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"trabalhando-com-proxy/","title":"Trabalhando com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"precomputar-endereco-contrato/","title":"Pré-computar endereço do Contrato com Create2","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc721/","title":"Criando nosso primeiro Token ERC721","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc20/","title":"Criando nosso primeiro Token ERC20","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-mapeamento-iteravel/","title":"Mapeamento Iterável","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-arvore-merkle/","title":"Árvore de Merkle","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-multi-assinatura/","title":"Carteira com Multi-Assinaturas","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-wallet/","title":"Carteira de Tokens","tags":["Iniciante","Aplicações"]}},{"frontmatter":{"suburl":"assinaturas-e-hashing-keccak/","title":"Verificando assinatura hashing com Keccak256","tags":["Intermediário","Avançado"]}},{"frontmatter":{"suburl":"abi/","title":"O que é ABI e para que serve?","tags":["Iniciante"]}},{"frontmatter":{"suburl":"import-e-libraries/","title":"Import e Libraries, para que servem?","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"criar-contrato-simples/","title":"Criar um contrato através de outro contrato","tags":["Intermediário"]}},{"frontmatter":{"suburl":"call-fallback-delegatecall/","title":"Call, Fallback, Delegatecall e chamadas de contratos","tags":["Intermediário"]}},{"frontmatter":{"suburl":"transfer-send-call/","title":"Enviar Ether com transfer, send e call","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"visibilidade-interface-pagavel/","title":"Visibilidade, Interfaces e Funções Pagáveis","tags":["Intermediário"]}},{"frontmatter":{"suburl":"evento-construtor-heranca/","title":"Evento, Construtor e Herança","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"tratamento-de-erros/","title":"Tratamento de erros de condições e exceções","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"funcoes/","title":"Funções e Modificadores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"armazenamento/","title":"Armazenamento de Dados","tags":["Intermediário"]}},{"frontmatter":{"suburl":"estruturas/","title":"Estruturas - Struct","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"enum/","title":"Enum - Enumeradores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"mapping-arrays/","title":"Mapping e Arrays","tags":["Iniciante"]}},{"frontmatter":{"suburl":"if-else-for-while/","title":"If, Else, For e While","tags":["Iniciante"]}},{"frontmatter":{"suburl":"ether-wei-gas/","title":"Ether, Wei e Taxa de Gas","tags":["Iniciante"]}},{"frontmatter":{"suburl":"variaveis/","title":"Entendendo as Variáveis","tags":["Iniciante"]}},{"frontmatter":{"suburl":"primeiro-aplicativo/","title":"Meu primeiro aplicativo","tags":["Iniciante","Aplicações"]}}]},"topicsYaml":{"topics":[{"desc":"Todos os conteúdos de nível iniciante estão disponíveis aqui","title":"Iniciante","url":"iniciante/"},{"desc":"Todos os conteúdos de nível intermediário estão disponíveis aqui","title":"Intermediário","url":"intermediario/"},{"desc":"Todos os conteúdos de nível avançado estão disponíveis aqui","title":"Avançado","url":"avancado/"},{"desc":"Todos os artigos referentes a exemplos de aplicações do Solidity, estão disponíveis aqui","title":"Aplicações","url":"aplicacoes/"},{"desc":"Todos os artigos referentes a exemplos de aplicação de hacks do Solidity, estão disponíveis aqui","title":"Hacks","url":"hacks/"},{"desc":"Todos os artigos referentes a exemplos de aplicação DeFi do Solidity, estão disponíveis aqui","title":"DeFi","url":"defi/"},{"desc":"Artigos de outras linguagens de programação, exemplos de interação entre a blockchain e aplicativos externos, estão disponíveis aqui","title":"Outros Artigos","url":"artigos/"}]}},"pageContext":{"suburl":"assinaturas-e-hashing-keccak/","postTopics":["Intermediário","Avançado"],"publishedAt":"28/05/2022","prevArticle":{"title":"O que é ABI e para que serve?","layout":"BlogPage","suburl":"abi/","author":["Matheus"],"tags":["Iniciante"],"publishedAt":"26/05/2022","modifiedAt":"20220526"},"nextArticle":{"title":"Carteira de Tokens","layout":"BlogPage","suburl":"aplicacao-wallet/","author":["Matheus"],"tags":["Iniciante","Aplicações"],"publishedAt":"29/05/2022","modifiedAt":"20220529"}}},"staticQueryHashes":["119291576","2330562257","4065828390"]}